// 操作关于user的数据操作
package models

import (
	"encoding/json"
	"fmt"
	"github.com/boyane/chartroom/common/message"
	"github.com/garyburd/redigo/redis"
)

type UserDao struct {
	pool *redis.Pool
}

// 我们在服务器启动后，就初始化一个userDao的实例，
// 把它做成全局的变量，在需要和redis操作时，就直接使用即可
var (
	MyUserDao *UserDao
)

// 初始化在连接池中获取一个连接
func NewUserDao(pool *redis.Pool) (userDao *UserDao) {
	userDao = &UserDao{
		pool: pool,
	}
	return
}

// 根据id获取用户信息
func (this *UserDao) getUserById(conn redis.Conn, id int) (user *User, err error) {
	// 查询数据
	res, err := redis.String(conn.Do("HGet", "users", id))
	if err != nil{
		// 错误
		if err == redis.ErrNil{ // 表示在 users 哈希中没有找到对应的id
			err = ERROR_USER_NOTEXISTS
		}
		return
	}

	// 将拿到的结果转化为对象
	user = &User{}
	err = json.Unmarshal([]byte(res), user)
	if err != nil{
		fmt.Println("getUserById -> json.Unmarshal err =", err)
		return
	}
	return
}

// 查看登陆是否成功
func (this *UserDao) Login(userId int, userPwd string) (user *User, err error) {
	// 拿到一个连接
	conn := this.pool.Get()
	user, err = this.getUserById(conn, userId)
	if err != nil{
		return
	}

	if userPwd != user.UserPwd {
		err = ERROR_USER_PWD
		return
	}

	return
}

// 注册用户
func (this *UserDao) Register(userMes *message.RegisterMes) (user *User, err error) {
	conn := this.pool.Get()
	// 判断当前注册用户id是否存在
	_, err = this.getUserById(conn, userMes.UserId)
	if err == nil{ // 表示用户id存在
		err = ERROR_USER_EXISTS
		return
	}

	// 注册用户
	data, err := json.Marshal(userMes)
	if err != nil{
		fmt.Println("Register -> json.Marshal err =", err)
		return
	}
	_, err = conn.Do("HSet", "users", userMes.UserId, string(data))
	if err != nil{
		fmt.Println("Register -> conn.Do err =", err)
		return
	}

	return
}